<?php

namespace App\Http\Controllers\Site\Center;

use App\Models\Address;
use App\Models\Cart;
use App\Models\Order;
use App\Models\Product;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class OrderController extends Controller
{

    //下面这个方法是用户在订单详情页点击"立即购买"的时候渲染订单页面的方法
    public function directIndex()
    {
        $product_id = \request('product_id');
        $product = Product::find($product_id);
        $num = \request('num');
//        然后就可以拼凑数据渲染页面了
        //当前用户的所有地址信息
        $address = Address::where('user_id', auth()->id())->latest()->get();
        //当前用户的默认地址
        $defaultAddress = $address->filter(function ($value) {
            //使用filter过滤的时候return的值如果为php的真(不一定必须是true),当前$value就返回,如果return的值为php中的假那遍历到的这个$value就被过滤掉,不会被返回
            return $value['is_default'];
        })->first();
        //然后再拼凑一个购物车对象过去
        $carts = new Cart();
        $carts['goods_id'] = $product['goods_id'];
        $carts['product_id'] = $product['id'];
//        当前货品的总价格
        $price = $product['addPrice'] + $product->goods->price;
        $carts->fill(['user_id' => auth()->id(), 'num' => $num, 'price' => $price, 'sum' => $price * $num]);
        //array_wrap 函数将给定的值包装成一个数组。如果给定的值已经是一个数组，则不会被改变
        $carts = collect(array_wrap($carts));
//        到这里就可以渲染模板了
        return view('site.order', compact('carts', 'defaultAddress', 'address'));

    }

    //下面这个方法是通过购物车结算进入订单页面的方法
    public function index(Request $request)
    {
//        要获取此时地址栏中传递过来的参数通过下面两种方法都可以
//        方法一:$request->query('cart_id')
//        request() 辅助函数返回当前请求实例或者获取输入项
//        方法二:\request('cart_id')
        //需要将当前用户的地址信息渲染到订单页面中
        $address = Address::where('user_id', auth()->id())->latest()->get();
//        还需要将传递过来的要结算的购物车记录传递到页面中
        $cart_id = explode(',', \request('cart_id'));
        /*
         * 通过下面的方法也可以获取到要结算的购物车记录,不过有whereIn()方法,用下面的方法就有点儿麻烦了
        $carts = array_map(function ($value){
            return Cart::find($value);
        },$cart_id);
        */
        $carts = Cart::whereIn('id', $cart_id)->get();
        /*        使用集合的each方法,只会迭代将集合中的内容传递到each中的回调函数中处理,使用集合的each方法没有返回值
                dd($address->each(function ($value){
                    if ($value['is_default']){
                        return $value['detail'];
                    }
                }));
        */
        /*
         * 使用集合对象的filter方法,最终只会返回满足条件的集合中的元素.以下面的为例子,我虽然在回调函数中写了return $str 但最终还是返回用户的默认地址对象$address
        dd($address->filter(function ($value){
            if ($value['is_default']){
                $str = $value['detail'];
                return $str;
            }
        }));
        */
//        将用户的默认地址也传递到页面中
        $defaultAddress = $address->filter(function ($value) {
            return $value['is_default'];
        })->first();
//        dd($defaultAddress);
        //加载订单页面的时候传递过去了3个参数一个是当前用户默认地址,当前用户的所有地址信息
        return view('site.order', compact('carts', 'address', 'defaultAddress'));
    }

    //这个方法专门用来生成订单号
    public function createOrderNum()
    {
        $orderNum = '';
        for ($i = 1; $i <= 5; $i++) {
            $orderNum .= random_int(1, 9);
        }
        return time() . $orderNum;
    }


    public function store(Request $request)
    {
//        将前台js对象异步的方式传递到php中的时候laravel自动会将其转成数组
//        return $request['carts']['goods'];
//        前台订单页面点击"提交订单"的时候通过axios异步post请求的方式访问到这个控制器方法,其实只用传递一个用户选中的当前订单发送地址的id就行了,用户当前要结算的购物车中的记录id通过request('cart_id')函数的方式仍然能获取到,因为此时的地址栏中仍然有cart_id这个参数d
//        \request('cart_id');
//        获取到要结算的购物车中记录的id,以及要发往的地址id
//        $detail = [];
        //拼凑向order表中插入数据的方法
        $data['address_id'] = $request['addressTo'];
        $data['user_id'] = auth()->id();
        $data['order_num'] = $this->createOrderNum();
        $data['status'] = '未付款';
        if ($request['cart_id']) {
//        将获取要结账的购物车相关记录的id字符串转成数组
            $carts = Cart::whereIn('id', explode(',', $request['cart_id']))->get();
            $data['totalprice'] = $carts->sum('sum');
            $detail = $carts->toArray();
        } else {
            $data['totalprice'] = $request['carts']['sum'];
            $detail[] = $request['carts'];
        }
//        dd($carts->toArray());
//        执行到这里就可以向order表中插入数据了,$order是新创建的订单模型
        $order = Order::create($data);
//            return $detail;
//        接着通过模型关联的方式向order_detail订单明细表中插入多条数据
        $order->detail()->createMany($detail);
//        当购物车中的记录已经结算并生成订单后需要将购物车中的相应记录删除掉
        //模型对象直接调用delete()方法就能删除模型对象,系统就会自动将该模型对象对应的数据从数据表中删除
        if ($request['cart_id']) {
            $carts->each(function ($value) {
                $value->delete();
            });
        }
        //订单创建完成后,给异步请求返回消息,并把产生的订单编号返回到前台,因为前台要带着这个订单编号跳转到支付页面
        return ['valid' => 1, 'message' => '订单创建成功', 'order_num' => $data['order_num']];

    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Order $order
     * @return \Illuminate\Http\Response
     */
    public function show(Order $order)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Order $order
     * @return \Illuminate\Http\Response
     */
    public function edit(Order $order)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \App\Models\Order $order
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Order $order)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Order $order
     * @return \Illuminate\Http\Response
     */
    public function destroy(Order $order)
    {
        //
    }
}
